package demo.collection;

import java.util.*;
import java.util.stream.Collectors;

public class TraversalAndRemove {
    public static void main(String[] args) {
        // 假设删除的是 list 和 set 中的偶数
        //TraversalAndRemoveList();
        //TraversalAndRemoveSet();
        //TraversalAndRemoveMap();
        TraversalAndRemoveMap2();
    }
    public static void TraversalAndRemoveMap2() {
        // 删除所有值为偶数的元素
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        map.put("d", 4);
        Iterator<String> iterator = map.keySet().iterator();
        while (iterator.hasNext()){
            map.remove(iterator.next());
        }
    }
    // List 集合
    public static void TraversalAndRemoveList(){
        Integer[] arr = new Integer[]{3, 5, 4, 9, 6};
        // 此处讲一个数组变为一个可变的 list 集合
        List<Integer> list = Arrays.stream(arr).collect(Collectors.toList());

        // 1. 传统 for循环 倒序遍历
        System.out.println("通过传统 for 循环倒序遍历并删除");
        for (int i = list.size()-1; i >= 0 ; i--) {
            if(list.get(i) % 2 == 0){
                list.remove(i);
            }
        }
        System.out.println(list);

        // 2. 通过迭代器中的 remove 方法
        System.out.println("通过迭代器中的 remove 方法遍历并删除");
        list = Arrays.stream(arr).collect(Collectors.toList());
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            if (iterator.next() % 2 == 0){
                iterator.remove();
            }
        }
        System.out.println(list);

        // 3. 使用 List 提供的 removeIf 方法
        System.out.println("通过 List 中的 removeIf 方法遍历并删除");
        list = Arrays.stream(arr).collect(Collectors.toList());
        list.removeIf(number -> number % 2 == 0);
        System.out.println(list);

        // 4. 使用 Stream API 不修改原集合, 生成一个不包含指定元素的新集合
        System.out.println("通过 Stream API 生成一个不包含指定元素的新集合");
        list = list.stream()
                .filter(number -> number % 2 != 0)
                .collect(Collectors.toList());
        System.out.println(list);
    }


    // Set 集合
    public static void TraversalAndRemoveSet(){
        Integer[] arr = new Integer[]{7, 6, 3, 8, 4};
        Set<Integer> set = Arrays.stream(arr).collect(Collectors.toSet());

        // 1. 使用 Iterator 的 remove 方法
        System.out.println("使用 Iterator 的 remove 方法");
        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            if (iterator.next() % 2 == 0){
                iterator.remove();
            }
        }
        System.out.println(set);

        // 2. 使用 Set 的 removeIf 方法
        System.out.println("使用 Set 提供的 removeIf 方法");
        set.removeIf(number -> number % 2 == 0);
        System.out.println(set);

        // 3. 使用 Stream API 不改变原集合, 生成一个新集合
        System.out.println("使用 Stream API 生成一个不包含指定元素的新集合");
        set = set.stream()
                .filter(number -> number % 2 != 0)
                .collect(Collectors.toSet());
        System.out.println(set);
    }


    // Map 集合
    public static void TraversalAndRemoveMap(){
        // 删除所有值为偶数的元素
        Map<String, Integer> map = new HashMap<>();
        map.put("a", 1);
        map.put("b", 2);
        map.put("c", 3);
        map.put("d", 4);


        // 1. 通过 entrySet 方法转化为 Set, 使用 iterator 的 remove 方法
        System.out.println("转化为 Set 后, 使用 iterator 的 remove 方法");
        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()){
            if(iterator.next().getValue() % 2 == 0){
                iterator.remove();
            }
        }
        System.out.println(map);


        // 2. 通过 entrySet 方法转化为 Set, 使用 removeIf 方法
        System.out.println("转化为 Set 后, 使用 removeIf 方法");
        map.entrySet().removeIf(entry -> entry.getValue() % 2 == 0);
        System.out.println(map);


        // 3. 使用 Stream API 生成一个不包含指定元素的新集合
        System.out.println("转化为 Set 后, 使用 Stream API");
        map = map.entrySet().stream()
                .filter(entry -> entry.getValue() % 2 != 0)
                .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
        System.out.println(map);
    }
}
